package cn.itcast.up32.up_web.service.impl;

import cn.itcast.up32.up_web.bean.dto.ModelDto;
import cn.itcast.up32.up_web.bean.dto.TagDto;
import cn.itcast.up32.up_web.bean.po.ModelPo;
import cn.itcast.up32.up_web.bean.po.TagPo;
import cn.itcast.up32.up_web.repo.ModelRepo;
import cn.itcast.up32.up_web.repo.TagRepo;
import cn.itcast.up32.up_web.service.TagService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/*
    标签的业务层实现类
 */
@Service
public class TagServiceImpl implements TagService {

    @Autowired
    private TagRepo tagRepo;
    @Autowired
    private ModelRepo modelRepo;

    /**
     * 保存标签的数据
     * @param tags
     */
    @Override
    public void save(List<TagDto> tags) {
        //将TagDto => TagPo
        //怎么转?
        //方案1
//        for (TagDto dto : tags) {
//            TagPo tagPo = new TagPo();
//            tagPo.setName(dto.getName());
//            tagPo.setLevel(dto.getLevel());
//        }
        //方案二
//        for (TagDto dto : tags) {
//            TagPo convert = convert(dto);
//        }
        //方案三
//        List<TagPo> collect = tags.stream().map((dto) -> {
//            return convert(dto);
//        }).collect(Collectors.toList());
        //方案四
        List<TagPo> list = tags.stream().map(this::convert).collect(Collectors.toList());
        //将TagPo进行保存.
        //保存标签的时候要设置Pid.
        if (list.size() == 3) {
            TagPo tmp = null;
            //方案1: 逐个保存
            //保存1级,获取1级的ID
            //先去数据库看有没有这个标签,如果有那么就直接使用,没有就保存
            TagPo tagPo1 = list.get(0);
            tmp = tagRepo.findByNameAndLevelAndPid(tagPo1.getName(), tagPo1.getLevel(), tagPo1.getPid());
            if (tmp == null){
                tmp = tagRepo.save(tagPo1);
            }
            //保存2级,使用1级的id作为二级的Pid,保存后获取2级的ID
            TagPo tagPo2 = list.get(1);
            tagPo2.setPid(tmp.getId());
            tmp = tagRepo.findByNameAndLevelAndPid(tagPo2.getName(), tagPo2.getLevel(), tagPo2.getPid());
            if (tmp == null){
                tmp = tagRepo.save(tagPo2);
            }
            //保存3级,使用2级的id作为三级的Pid
            TagPo tagPo3 = list.get(2);
            tagPo3.setPid(tmp.getId());
            tmp = tagRepo.findByNameAndLevelAndPid(tagPo3.getName(), tagPo3.getLevel(), tagPo3.getPid());
            if (tmp == null){
                tagRepo.save(tagPo3);
            }
        }

        //方案2: 使用循环.



    }

    @Override
    public List<TagDto> findByLevel(Integer level) {
       return tagRepo.findByLevel(level).stream().map(this::convert).collect(Collectors.toList());
    }

    @Override
    public List<TagDto> findByPid(Long pid) {
        return tagRepo.findByPid(pid).stream().map(this::convert).collect(Collectors.toList());
    }

    /**
     * 保存4级标签和模型
     * @param tag
     * @param model
     */
    @Override
    public void addTagModel(TagDto tag, ModelDto model) {
        //先保存tag,获取到当前4级标签的ID.
        TagPo tagPo = convert(tag);
        TagPo saveTagPo = tagRepo.save(tagPo);

        //拿到4级标签id作为当前模型的tag_id
        ModelPo modelPo = convert(model, saveTagPo.getId());
        modelRepo.save(modelPo);
    }

    private ModelPo convert(ModelDto modelDto, Long id) {
        ModelPo modelPo = new ModelPo();
        modelPo.setId(modelDto.getId());
        modelPo.setTagId(id);
        modelPo.setName(modelDto.getName());
        modelPo.setMainClass(modelDto.getMainClass());
        modelPo.setPath(modelDto.getPath());
        modelPo.setSchedule(modelDto.getSchedule().toPattern());
        modelPo.setCtime(new Date());
        modelPo.setUtime(new Date());
        modelPo.setState(modelDto.getState());
        modelPo.setArgs(modelDto.getArgs());
        return modelPo;
    }



    private TagDto convert(TagPo po){
        TagDto tagDto = new TagDto();
        tagDto.setId(po.getId());
        tagDto.setLevel(po.getLevel());
        tagDto.setName(po.getName());
        tagDto.setPid(po.getPid());
        tagDto.setRule(po.getRule());
        return tagDto;
    }


    /**
     * 将TagDto对象转换为TagPo对象
     * @param dto
     */
    private TagPo convert(TagDto dto){
        TagPo tagPo = new TagPo();
        //dto里面有什么数据,我们就给Po什么数据
        tagPo.setId(dto.getId());
        tagPo.setLevel(dto.getLevel());
        //如果当前的等级1,那么直接设置Pid = -1
        if (dto.getLevel() == 1) {
            tagPo.setPid(-1L);
        } else {
            tagPo.setPid(dto.getPid());
        }
        tagPo.setName(dto.getName());
        tagPo.setRule(dto.getRule());
        return tagPo;
    }


}



















